home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 081-090 / amok87 / rekursionen / hilbert.mod < prev    next >
Text File  |  1993-11-04  |  3KB  |  110 lines

  1. (*------------------------------------------------------------------------------
  2.      :Program.    hilbert.mod
  3.      :Contents.   zeichnet (rekursiv) die Hilbert-Kurven 
  4.      :Author.     Matthias Scherrer
  5.      :Address.    Baselstrasse 63, CH-4242 Laufen
  6.      :Phone.      ++(0)61/7613975
  7.      :Copyright.  PD
  8.      :Language.   Oberon
  9.      :Translator. Oberon V3.00d
  10.      :History.    V1.0,24-Nov-92  fuer Oberon V2.14d
  11.      :History.    V1.1,29-Dec-92  angepasst an Oberon V3.00d, Optimierungen
  12.                                   am Source
  13. ------------------------------------------------------------------------------*)
  14. MODULE hilbert;
  15.  
  16. IMPORT  di: Display, io, Mouse;
  17.  
  18. CONST
  19.   width  = 716;
  20.   height = 472;
  21.   
  22. TYPE
  23.   Pos = RECORD
  24.            x,y : INTEGER;
  25.         END;
  26.  
  27. VAR
  28.   screen      : di.ScreenPtr;
  29.   b           : BOOLEAN;
  30.   cord        : Pos;
  31.   n,s         : INTEGER;
  32.  
  33.  
  34. (*------------------------------------------------------------*)
  35. (*    Proceduren fuer Intuition (Screen oeffnen/schliessen)   *)
  36. (*------------------------------------------------------------*)
  37.  
  38. PROCEDURE InitGraph;
  39. BEGIN
  40.   NEW(screen);
  41.   b:=di.OpenScreen(screen,"Hilbert-Kurven",0,0,width,height,1,TRUE,TRUE);
  42. END InitGraph;
  43.  
  44. PROCEDURE Close;
  45. BEGIN  
  46.   di.Close(screen) 
  47.   (* $IFNOT GarbageCollector *)
  48.     DISPOSE(screen);
  49.   (* $END *)
  50. END Close;
  51.  
  52.  
  53. (*------------------------------------------------------------*)
  54. (*        Proceduren, die die Zwischenstuecke zeichnen        *)
  55. (*------------------------------------------------------------*)
  56.  
  57. PROCEDURE P(lx,ly : INTEGER);
  58. BEGIN
  59.   cord.x:=cord.x+lx; cord.y:=cord.y+ly;
  60.   di.Draw(screen,cord.x,cord.y)
  61. END P;
  62.  
  63.  
  64. (*------------------------------------------------------------*)
  65. (*                    Hier die Rekursion                      *)
  66. (*------------------------------------------------------------*)
  67.  
  68. PROCEDURE Draw(n,l,z : INTEGER);
  69. BEGIN
  70.   IF n>0 THEN
  71.  
  72.     CASE z OF
  73.         0: Draw(n-1,l,1); P(-l, 0); Draw(n-1,l,0); P( 0, l); 
  74.            Draw(n-1,l,0); P( l, 0); Draw(n-1,l,3);
  75.  
  76.       | 1: Draw(n-1,l,0); P( 0, l); Draw(n-1,l,1); P(-l, 0); 
  77.            Draw(n-1,l,1); P( 0,-l); Draw(n-1,l,2);
  78.  
  79.       | 2: Draw(n-1,l,3); P( l, 0); Draw(n-1,l,2); P( 0,-l); 
  80.            Draw(n-1,l,2); P(-l, 0); Draw(n-1,l,1);
  81.  
  82.       | 3: Draw(n-1,l,2); P( 0,-l); Draw(n-1,l,3); P( l, 0); 
  83.            Draw(n-1,l,3); P( 0, l); Draw(n-1,l,0);
  84.  
  85.     END; (* CASE *)
  86.  
  87.   END; (* IF *)
  88. END Draw;
  89.  
  90.  
  91. (*------------------------------------------------------------*)
  92. (*               Und noch das Hauptprogramm...                *)
  93. (*------------------------------------------------------------*)
  94.  
  95. BEGIN
  96.   io.WriteString("Seitenlaenge  : "); b:=io.ReadInteger(s);
  97.   io.WriteString("Tiefe (n)     : "); b:=io.ReadInteger(n);
  98.  
  99.   InitGraph; 
  100.  
  101.   cord.x:=width-1; cord.y:=15; (* Anfangskoordinaten *)
  102.   di.Move(screen,cord.x,cord.y);
  103.  
  104.   Draw(n,s,0);  (* n, Seitenlaenge, 0=Oeffnung nach rechts *)
  105.  
  106.   Mouse.WaitLMB;
  107.  
  108.   Close;
  109. END hilbert.
  110.